<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
           创建类(用 class 声明)
              语法结构：
                class 类名{
                    constructor(){

                    }
                }
        类是对事物的属性和方法进行了抽象，特点如下：
            1.有两个成员：属性和方法。
            2.构造方法的目的是给对象的属性赋值，并返回这个对象。
              即类通过调用构造函数，返回一个属性已经初始化的对象。

        创建实例(对象)
        var xx = new 类名();
        */
        // 1.创建类 class 关键词声明一个明星类
        class Star {
            constructor(uname, age){
                this.uname =  uname;
                this.age = age;
            }
            sing(song){
                console.log(this.uname + "---演唱了---"  + song);
            }
            address = '郑州'     // 一般写在构造函数中，每个对象的属性不一样
        }

        // 2.通过 new 生成对象。此时会调用构造函数，返回一个属性已经初始化的对象。
        var jay = new Star('周杰伦', 22);
        var eason = new Star('陈奕迅',18);
        jay.sex = "男";   // 动态添加属性
        console.log(jay);
        console.log(eason);

        /*
           总结：
              1.通过 class 关键字声明。 类名大驼峰规则
              2.constructor 声明构造函数，接收参数，对象的属性初始化，并返回实例(对象)。不写默认创建无参
              3.new 是申请新的内存空间。 类名(),即调用构造函数。
              4.类的属性一般写在构造函数中，因为每个对象的属性不一样，且类可以动态的添加属性。
        */

        /*
           3.方法的声明
              3.1省略 function 
              3.2 多个函数之间不需要逗号切割
        */
       jay.sing('青花瓷')
       eason.sing('富士山下')
    </script>
</body>
</html>